package lang;

import java.util.Arrays;

/*
* 文件放在这个java在jdk中
* 格式：JDK + 版本号 Java + 类名 Method + 方法名
* */

public class JDK8JavaSystemMethodArrayCopy {


   public static void main(String[] args) {
       arraycopyBaseTest();

   }

    // ---------------------------------------------------------------------- Method arraycopy
    // 参考: https://app.yinxiang.com/shard/s59/nl/27170006/cbf92c19-9298-456e-97ca-e767e550c108
    /**
     * 证明 arraycopy 是浅拷贝
     */
    private static void arraycopyShallowCopy() {
        User [] users=new User[]{new User(1,"admin","admin@qq.com"),new User(2,"maco","maco@qq,com"),new User(3,"kitty","kitty@qq,com")};//初始化对象数组
        User [] target=new User[users.length];//新建一个目标对象数组
        System.arraycopy(users, 0, target, 0, users.length);//实现复制
        // 值一样，就会去比较地址，所有都一样，两个对象才相等
        System.out.println("源对象与目标对象的物理地址是否一样："+(users[0] == target[0]?"浅复制":"深复制"));
        target[0].setEmail("admin@sina.com");
        System.out.println("修改目标对象的属性值后源对象users：");
        for (User user : users){
            System.out.println(user);
        }
    }

    /**
     * 基本操作
     */
    /*
    *
    * (destPos + length) <= destPos.length 不会越界
    *  (destPos + length) > destPos.length 就会越界
    *
    * destPos 不加1，是因为 destPos 是从0开始的下标 ，但是 会把下标等于 destPos 的元素也覆盖掉
    * 数组索引越界
    * Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
    *
    * */

    private static void arraycopyBaseTest() {
        // 参数解释：src表示源数组，srcPos 表示源数组要复制的起始位置，dest 表示目标数组，destPos 表示目标数组位置，length 表示要复制的长度。
        // 下标从0开始，要复制的下标范围 [srcPos,length-1]
        // srcPos、destPos 是从 0 开始的

        // 不用给目标数组赋值，目标数组会被改变，destPos 的地方有值，值会被覆盖。
        char[]a= {'a','b','c','d','e','f'},
                b= {'1','2','3','4','5','6'};
        int []c= {1,2,3,4,5,6},
                d= {10,20,30,40,50,60};
        // 把 a 数组复制到 b 数组（b从下标0开始）
        System.arraycopy(a, 0, b, 0, a.length);
        // 把 c 数组复制到 d 数组（d从下标2开始）
        System.arraycopy(c, 2, d, 2, c.length-3);

        System.out.println("(destPos + length) < destPos.length");

        System.out.println("数组a的各个元素中的值：" + Arrays.toString(a));
        System.out.println("数组b的各个元素中的值：" + Arrays.toString(b));
        System.out.println("数组c的各个元素中的值：" + Arrays.toString(c));
        System.out.println("数组d的各个元素中的值：" + Arrays.toString(d));
        // 数组a的各个元素中的值：[a, b, c, d, e, f]
        // 数组b的各个元素中的值：[a, b, c, d, e, f]
        // 数组c的各个元素中的值：[1, 2, 3, 4, 5, 6]
        // 数组d的各个元素中的值：[10, 20, 3, 4, 5, 60]

        // (destPos + length) = destPos.length
        // destPos 不加1，是因为 destPos 是从0开始的下标 ，但是 会把下标等于 destPos 的元素也覆盖掉
        //
        int[] c1= {1,2,3,4,5,6},d1= {10,20,30,40,50,60};

        System.arraycopy(c1, 2, d1, 2, 4);
        System.out.println("(destPos + length) = destPos.length");
        System.out.println("数组c1的各个元素中的值：" + Arrays.toString(c1));
        System.out.println("数组d1的各个元素中的值：" + Arrays.toString(d1));


        System.out.println("(destPos + length) > destPos.length 会越界 java.lang.ArrayIndexOutOfBoundsException");

        // java.lang.ArrayIndexOutOfBoundsException
        // (destPos + length) > destPos.length
        // destPos 不加1，是因为 destPos 是从0开始的下标 ，但是 会把下标等于 destPos 的元素也覆盖掉
        //
//        int[] c2= {1,2,3,4,5,6},d2= {10,20,30,40,50,60};
//
//        System.arraycopy(c2, 2, d2, 2, 5);
//        System.out.println("(destPos + length) > destPos.length 会越界 java.lang.ArrayIndexOutOfBoundsException");
//        System.out.println("数组c2的各个元素中的值：" + Arrays.toString(c2));
//        System.out.println("数组d2的各个元素中的值：" + Arrays.toString(d2));

    }

    // ---------------------------------------------------------------------- Method arraycopy


}
// ---------------------------------------------------------------------- Method arraycopy

class User{
    private Integer id;
    private String username;
    private String email;
    //无参构造函数
    public User() {	}
    //有参的构造函数
    public User(Integer id, String username, String email) {
        super();
        this.id = id;
        this.username = username;
        this.email = email;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", email=" + email
                + "]";
    }
}
// ---------------------------------------------------------------------- Method arraycopy
